package com.itany.corejava.code15_stream;

import java.util.Arrays;
import java.util.List;

/**
 * @author 石小俊
 * @date 2023年05月31日 11:21
 */
public class Test02_中间操作 {
    private static List<Integer> list = Arrays.asList(1, 3, 18, 11, 13, 15, 6, 4, 5, 9, 2);

    public static void main(String[] args) {
        filterTest();
        distinctTest();
        limitTest();
        skipTest();
        findPage(2, 5);
        findPage(3, 5);
        mapTest();
        sortedTest();
        sortedComparatorTest();
    }

    public static void filterTest() {
        // 过滤操作,用于过滤元素是否符合指定规则
        // 其规则通过Predicate进行过滤
        list.stream()
                // 过滤所有的偶数
                .filter(i -> i % 2 == 0)
                // 通过终止操作执行
                .forEach(System.out::println);
    }

    public static void distinctTest() {
        list.stream()
                // 去重
                .distinct()
                .forEach(System.out::println);
    }

    public static void limitTest() {
        list.stream()
                // 获取前5个元素
                .limit(5)
                .forEach(System.out::println);
    }

    public static void skipTest() {
        list.stream()
                // 跳过前5个
                // .skip(5)
                // 跳过的数量超过元素数量,则显示空流
                .skip(20)
                .forEach(System.out::println);
    }

    /**
     * 模拟分页
     *
     * @param pageNo   页码
     * @param pageSize 一页显示多少条数据
     */
    public static void findPage(Integer pageNo, Integer pageSize) {
        list.stream()
                // 其规律与MySQL中分页规律一致
                .skip((pageNo - 1) * pageSize)
                .limit(pageSize)
                .forEach(System.out::println);
    }

    public static void mapTest() {
        list.stream()
                // 对流中的每一个元素的值进行翻倍
                .map(i -> i * 2)
                .forEach(System.out::println);
    }

    public static void sortedTest() {
        list.stream()
                .sorted()
                .forEach(System.out::println);
        List<String> names = Arrays.asList("jack", "tom", "alice", "root", "admin", "lily");
        names.stream()
                .sorted()
                .forEach(System.out::println);
    }

    public static void sortedComparatorTest() {
        list.stream()
                // 降序
                .sorted((o1, o2) -> o2 - o1)
                .forEach(System.out::println);
        List<String> names = Arrays.asList("jack", "tom", "alice", "root", "admin", "lily");
        names.stream()
                // 升序
                .sorted((o1, o2) -> o1.length() - o2.length())
                .forEach(System.out::println);
    }
}
